﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <thread>
#include "ui_Update.h"
#include "tcpThread.h"
#include "adbworker.h"
#include "securefileuploader.h"


//TYPE = 0 点云
//TYPE = 1 雷视
#define TYPE 1


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class Update : public QMainWindow
{
    Q_OBJECT

public:
    Update(QWidget *parent = nullptr);
    ~Update();

private:
    Ui::UpdateClass ui;
    //线程工作标志位
    int m_workflag = -1;
//    QSsh::SshConnectionParameters argParameters;
//    // SSH Socket
//    QSsh::SshConnection * sshSocket = nullptr;
    // Shell 脚本
  //  QSharedPointer<QSsh::SshRemoteProcess> shell;

    //雷达进入APP定时器
    //设置硬件特征号异常
    QTimer* m_setid;
    int m_setidnum = 0;
    //总体升级结果
    bool allresult = true;
    //转接板升级结果
    bool h7r = false;
    //远程板升级结果
    bool lr = false;
    //中程板升级结果
    bool mr = false;
    //近程板升级结果
    bool sr = false;
    //摄像头升级结果
    bool cr = false;
    //当前升级对象
    QString name = "";
    //配置日志文件保存位置标志位
    bool m_setsavepath = false;
    virtual void closeEvent(QCloseEvent *event);
    int filecount = 0;
    //字体
    QFont font;
    //线程
    tcpThread* m_thread;
    //固件选择标志位
    bool m_choosefile[5];
    //固件

    QString fileName[5];
    //待升级固件
    bool updatename[5];
    //待升级数量
    int updatenum = 0;
    //已完成数量
    int updatednum = 0;
    //加载css文件
    void loadStyleSheet(const QString &sheetName);
    int checkversionnum = 0;
    //应答定时器
    QTimer* m_anstimer;
    //芯片升级应答定时器
    QTimer* m_ganstimer;
    QTimer* m_checkversiontimer;
    //H7版本信息
    //boot参数
    u8_t m_boot[2];
    //iap参数
    u8_t m_iap[2];
    //arm参数
    u8_t m_arm[6];
    //hard-in参数
    u8_t m_hard_in[6];
    //BOOT信息
    u8_t tsmboot[2];
    u8_t tsmiap[2];
    u8_t tsmhard_in[6];
    u8_t tsmarm[6];
    //文件字节数
    unsigned int m_filesize = 0;
    //TSM文件
    QByteArray tsmfile;
    //保存升级记录
    void saveUpdatelog(bool);
    //硬件特征号异常记录
    void saveUpdatehardidlog(bool);
    //升级信息
    //产品序列号
    QString m_serialnum;
    //MAC地址
    QString m_macaddress;
    //BOOT版本
    QString m_bootversion;
    //APP版本
    QString m_appversion;
    //摄像头版本号
    QString m_cameraversion;
    //硬件特征号
    QString m_hardwarenum;
    QButtonGroup* m_envirgroup;
    //日志文件保存路径
    QString savepath = "";
    //SecureFileUploader* m_sshcon;
    QTcpSocket* m_socket;
    QTimer* m_recontimer;
    QTimer* m_readb;
    int m_flag = -1;
    ADBWorker* adbWorker;
    QThread* adbThread;
    std::thread my_thread;
    //字符转换
    static QByteArray hexStrToByteArray(const QString &str);
    static char convertHexChar(char ch);
signals:
    //设置硬件特征号
    void sethardid(QString);
    //打开BOOT鉴权
    void openbootkey();
    //关闭BOOT鉴权
    void closebootkey();
    //导入升级文件
    void sendTsm(const QByteArray,unsigned int);
    //连接设备
    void connectRadar(QString,quint16,QString,QString,int,bool);
    //断开设备
    void disconnectRadar();
    //升级指令集
    //0-比对H7版本信息
    //1-H7开始升级
    //2-远程板开始升级
    //3-中程板开始升级
    //4-近程板开始升级
    void updatecmd(int);
    //传输SSH指令
    void sendSSHcmd(QString);

private slots :
    //选择50
    void choose50();
    //选择35
    void choose35();
    //选择30
    void choose30();
    //连接
    void Slot_Connect();
    //断开
    void Slot_DisConnect();
    //升级过程应答
    void Slot_UpdateAnswer(int);
    //选择固件
    void Slot_Choosefile();
    //比对H7版本信息
    void Slot_CheckH7version(const QByteArray&);
    //开始升级
    void Slot_StartUpdate();
    //终止升级
    void Slot_StopUpdate();
    //新文件传输进度
    //void Slot_Reloadprogress(int);
    //锁定升级文件
    void Slot_LockUpdatefile();
    //锁定信息输入
    void Slot_LockMsg(int);
    //清空日志
    void Slot_ClearLog();
    //版本信息
    void Slot_Version();
    //显示等待应答
    void Slot_Waitforans();
    //芯片升级应答
    void Slot_Gupdateans();
    //获取雷达数据
    void Slot_Revradarmsg(QString,int);
    //指令超时显示
    void Slot_Showtimeout(int);
    //鉴权非鉴权模式切换
    void Slot_EnvironmentChange(int, bool);
    //硬件特征号设置完成
    void Slot_sethardidover();
    //配置文件保存路径
    void Slot_savefiledir();
    //转接板固件
    void Slot_h7tsmfile();
    //远程板固件
    void Slot_lrrtsmfile();
    //中程板固件
    void Slot_mrrtsmfile();
    //近程板固件
    void Slot_srrtsmfile();
    //硬件特征号设置异常
    void Slot_setidout();
    //void dataReceived();

    void on_pushButton_14_clicked();
    void on_pushButton_15_clicked();
    void on_pushButton_clicked();
    //预定义显示
    void Slot_showsshmsg(int);
    //SSH消息显示
    void Slot_showsshrevmsg(QString);
    //连接成功
    void Slot_connected();
    //断开成功
    void Slot_disconnected();
    //接收消息
    void Slot_revmsg();
    //重连定时器
    void Slot_reconnect();
    void Slot_checkversion();

    void on_pushButton_16_clicked();
    void Slot_checkversiontimeout();
    void Slot_showADBans(int,QString);
    //ADB线程结束
    void Slot_threadfinished();
};
#endif // MAINWINDOW_H
